﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;


//int Add(int left, int right)
//{
//	return left + right;
//}
//
//int main()
//{
//	int ret = 0;
//	ret = Add(1, 2);
//
//	return 0;
//}


//// F.h
//#include <iostream>
//using namespace std;
//
//inline void f(int i);
//
//// F.cpp
//#include "F.h"
//
//void f(int i)
//{
//	cout << i << endl;
//}
//
//// main.cpp
//#include "F.h"
//
//int main()
//{
//	f(10);
//	return 0;
//}


//内联函数

//#define N 10

//实现一个Add的宏函数
//#define Add(x, y) ((x)+(y))
//
//int main()
//{
//	int ret = 0;
//	ret = Add(1, 2);
//	cout << ret << endl;
//
//	return 0;
//}

//inline int Add(int left, int right)
//{
//	return left + right;
//}
//
//int main()
//{
//	int ret = 0;
//	ret = Add(1, 2);
//
//	return 0;
//}


////宏的缺点：
////1、容易出错，语法坑很多
////2、不能调试
////3、没有类型安全检查
//
////宏函数的优点：
////1、没有类型的严格限制
////2、针对频繁调用小函数，不需要再建立栈帧，提高了效率
//
//
////内联函数
////优点：不会建立栈帧
//inline int add(int x, int y)
//{
//	return x + y;
//}
////不调用函数，直接展开
//int main()
//{
//	int ret = add(1, 2);
//	cout << ret << endl;
//
//	return 0;
//}

//内联函数以复制为代价，活动产函数开销

//如果函数的代码较长，使用内联将消耗过多内存

//如果函数体内有循环，那么执行函数代码时间比调用开销大。


//#include"Func.h"
//
//int main()
//{
//	func(10);
//	return 0;
//}



//auto关键字 --- 自动推导
//int main()
//{
//	int a = 0;
//	auto b = a;
//	auto c = &a;
//	auto& d = a;
//
//	//普通场景没有什么价值
//	//类型很长，就有价值,简化代码
//	std::vector<std::string> v;
//	//std::vector<std::string>::iterator it = v.begin();;
//	auto it = v.begin();
//
//	return 0;
//}


//int TestAuto()
//{
//	return 10;
//}
//int main()
//{
//	int a = 10;
//	auto b = a;
//	auto c = 'a';
//	auto d = 8.6;
//	auto e = TestAuto();
//
//	cout << typeid(b).name() << endl;
//	cout << typeid(c).name() << endl;
//	cout << typeid(d).name() << endl;
//	cout << typeid(e).name() << endl;
//	
//	return 0;
//}

//int main()
//{
//	auto x;
//
//	return 0;
//}


//int main()
//{
//	int x = 10;
//	auto a = &x;
//	auto* b = &x;
//	auto& c = x;
//
//	cout << a << " " << b << " " << c << " " << endl;
//	cout << typeid(a).name() << endl;
//	cout << typeid(b).name() << endl;
//	cout << typeid(c).name() << endl;
//
//	return 0;
//}



//void TestAuto()
//{
//	auto a = 1, b = 2;
//	auto c = 3, d = 4.0;  // 该行代码会编译失败，因为c和d的初始化表达式类型不同
//}

//int main()
//{
//	//auto a = 1, b = 2;
//	auto c = 3, d = 4.0;
//
//
//	return 0;
//}

// 此处代码编译失败，auto不能作为形参类型，因为编译器无法对a的实际类型进行推导
//void TestAuto(auto a)
//{
//	//...
//}

//void TestAuto()
//{
//	int a[] = { 1,2,3 };
//	auto b[] = { 4，5，6 };
//}


//typeid --- 看实际类型
//int main()
//{
//	int a = 0;
//	auto b = a;
//	auto c = &a;
//	auto& d = a;
//
//	cout << typeid(b).name() << endl;
//	cout << typeid(c).name() << endl;
//	cout << typeid(d).name() << endl;
//
//	return 0;
//}



//范围for
//int main()
//{	
//	int array[] = { 1, 2, 3, 4, 5 };
//
//	for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
//	{
//		array[i] *= 2;
//	}
//		
//
//	for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
//	{
//		cout << array[i] << " ";
//	}
//	cout << endl;
//
//	//范围for
//	//依次取数组中的数据赋值给e
//	//自动判断结束
//	//自动迭代
//	for (auto e : array)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	return 0;
//}


//void TestFor(int array[])
//{
//	for (auto& e : array)
//		cout << e << endl;
//}

//
//void f(int)
//{
//	cout << "f(int)" << endl;
//}
//void f(int*)
//{
//	cout << "f(int*)" << endl;
//}
//int main()
//{
//	f(0);
//	f(NULL);
//	f((int*)NULL);
//	return 0;
//}



//int main()
//{
//	int array[] = { 1, 2, 3, 4, 5 };
//
//	for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
//	{
//		array[i] *= 2;
//	}
//
//
//	for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
//	{
//		cout << array[i] << " ";
//	}
//	cout << endl;
//
//	return 0;
//}



//int main()
//{
//	int array[] = { 1,2,3,4,5 };
//
//	for (auto& x : array)
//	{
//		x *= 2;
//	}
//
//	for (auto x : array)
//	{
//		cout << x << " ";
//	}
//	cout << endl;
//
//	return 0;
//}



//nullptr关键字
//C的一个坑
//void func(int)
//{
//	cout << "f(int)" << endl;
//}
//void func(int*)
//{
//	cout << "f(int*)" << endl;
//}
//int main()
//{
//	func(0);
//	func(NULL);
//
//	func((int*)NULL);
//	func(nullptr);//nullptr --- (void*)类型
//
//	return 0;
//}
